home *** CD-ROM | disk | FTP | other *** search
- /*
- * $CC $CFLAGS -I../.. debugm.c -lclamav -lefence (or what ever memory debugger)
- * If you're going to use HAVE_BACKTRACE, ensure CFLAGS includes -g and doesn't
- * include -fomit-frame-pointer
- *
- * njh@bandsman.co.uk
- */
- #include <stdio.h>
- #include <errno.h>
- #include <sys/stat.h>
- #include <sys/types.h>
- #include <fcntl.h>
- #include <malloc.h>
- #include <clamav.h>
- #include <sys/resource.h>
- #include <signal.h>
- #include <features.h>
- #include "clamav-config.h"
-
- #if __GLIBC__ == 2 && __GLIBC_MINOR__ >= 1
- /*#define HAVE_BACKTRACE /* Only tested on Linux... */
- #endif
-
- #ifdef HAVE_BACKTRACE
- #include <execinfo.h>
- #endif
-
- static void print_trace(void);
- static void sigsegv(int sig);
-
- static void
- sigsegv(int sig)
- {
- signal(SIGSEGV, SIG_DFL);
- print_trace();
- _exit(SIGSEGV);
- }
-
- static void
- print_trace(void)
- {
- #ifdef HAVE_BACKTRACE
- void *array[10];
- size_t size, i;
- char **strings;
-
- puts("Segfault caught, backtrace:");
-
- size = backtrace(array, 10);
- strings = backtrace_symbols(array, size);
-
- for(i = 0; i < size; i++)
- printf("\t%s\n", strings[i]);
-
- free(strings);
- #endif
- }
-
- int
- main(int argc, char **argv)
- {
- struct rlimit rlim;
-
- if(argc == 1) {
- fprintf(stderr, "Usage: %s files...\n", argv[0]);
- return 1;
- }
- rlim.rlim_cur = rlim.rlim_max = RLIM_INFINITY;
- if(setrlimit(RLIMIT_CORE, &rlim) < 0)
- perror("setrlimit");
-
- if(mkdir("/tmp/mboxtest", 0750) < 0) {
- perror("/tmp/mboxtest");
- return errno;
- }
- signal(SIGSEGV, sigsegv);
- while(*++argv) {
- int fd = open(*argv, 0);
-
- if(fd < 0) {
- perror(*argv);
- return errno;
- }
- printf("cl_mbox(%s) returns %d\n",
- *argv, cl_mbox("/tmp/mboxtest", fd));
- close(fd);
- }
- puts("Finished - don't forget to rm -rf /tmp/mboxtest");
-
- return 0;
- }
-